graphene_rect_t transformed_clip;
graphene_rect_t intersection;
GskRoundedRect child_clip;
- RenderOp op;
struct {
float w;
float h;
prev_clip = ops_set_clip (builder, &child_clip);
- op.op = OP_CHANGE_BORDER;
- op.border.widths[0] = widths[0];
- op.border.widths[1] = widths[1];
- op.border.widths[2] = widths[2];
- op.border.widths[3] = widths[3];
- ops_add (builder, &op);
+ ops_set_border (builder, widths);
}
else
{
}
/* Top */
- ops_set_color (builder, &colors[0]);
+ ops_set_border_color (builder, &colors[0]);
ops_draw (builder, (const GskQuadVertex[6]) {
{ { min_x, min_y }, { 0, 1 }, }, /* Upper left */
{ { min_x + sizes[0].w, min_y + sizes[0].h }, { 0, 0 }, }, /* Lower left */
});
/* Right */
- ops_set_color (builder, &colors[1]);
+ ops_set_border_color (builder, &colors[1]);
ops_draw (builder, (const GskQuadVertex[6]) {
{ { max_x - sizes[1].w, min_y + sizes[1].h }, { 0, 1 }, }, /* Upper left */
{ { max_x - sizes[2].w, max_y - sizes[2].h }, { 0, 0 }, }, /* Lower left */
});
/* Bottom */
- ops_set_color (builder, &colors[2]);
+ ops_set_border_color (builder, &colors[2]);
ops_draw (builder, (const GskQuadVertex[6]) {
{ { min_x + sizes[3].w, max_y - sizes[3].h }, { 0, 1 }, }, /* Upper left */
{ { min_x, max_y }, { 0, 0 }, }, /* Lower left */
});
/* Left */
- ops_set_color (builder, &colors[3]);
+ ops_set_border_color (builder, &colors[3]);
ops_draw (builder, (const GskQuadVertex[6]) {
{ { min_x, min_y }, { 0, 1 }, }, /* Upper left */
{ { min_x, max_y }, { 0, 0 }, }, /* Lower left */
case OP_CHANGE_COLOR:
OP_PRINT (" -> Color: (%f, %f, %f, %f)", op->color.red, op->color.green, op->color.blue, op->color.alpha);
g_assert (program == &self->color_program || program == &self->coloring_program ||
- program == &self->shadow_program || program == &self->border_program);
+ program == &self->shadow_program);
/* TODO: We use color.color_location here and this is right for all three of the programs above,
* but that's just a coincidence. */
glUniform4f (program->color.color_location,
op->color.red, op->color.green, op->color.blue, op->color.alpha);
break;
+ case OP_CHANGE_BORDER_COLOR:
+ OP_PRINT (" -> Border color (%f, %f, %f, %f)",
+ op->border.color[0], op->border.color[1], op->border.color[2], op->border.color[3]);
+ g_assert (program == &self->border_program);
+ glUniform4fv (program->border.color_location, 1, op->border.color);
+ break;
+
case OP_CHANGE_CLIP:
OP_PRINT (" -> Clip (%f, %f, %f, %f) (%f, %f, %f, %f), (%f, %f, %f, %f)",
op->clip.bounds.origin.x, op->clip.bounds.origin.y,
#include "gskglrenderopsprivate.h"
+static inline void
+rgba_to_float (const GdkRGBA *c,
+ float *f)
+{
+ f[0] = c->red;
+ f[1] = c->green;
+ f[2] = c->blue;
+ f[3] = c->alpha;
+}
void
ops_set_program (RenderOpBuilder *builder,
g_array_append_val (builder->render_ops, op);
}
+void
+ops_set_border (RenderOpBuilder *builder,
+ const float *widths)
+{
+ RenderOp op;
+
+ if (memcmp (&builder->program_state[builder->current_program->index].border.widths,
+ widths, sizeof (float) * 4) == 0)
+ return;
+
+ memcpy (&builder->program_state[builder->current_program->index].border.widths,
+ widths, sizeof (float) * 4);
+
+ op.op = OP_CHANGE_BORDER;
+ op.border.widths[0] = widths[0];
+ op.border.widths[1] = widths[1];
+ op.border.widths[2] = widths[2];
+ op.border.widths[3] = widths[3];
+ g_array_append_val (builder->render_ops, op);
+}
+
+void
+ops_set_border_color (RenderOpBuilder *builder,
+ const GdkRGBA *color)
+{
+ RenderOp op;
+ op.op = OP_CHANGE_BORDER_COLOR;
+ rgba_to_float (color, op.border.color);
+
+ if (memcmp (&op.border.color, &builder->program_state[builder->current_program->index].border.color,
+ sizeof (float) * 4) == 0)
+ return;
+
+ rgba_to_float (color, builder->program_state[builder->current_program->index].border.color);
+
+ g_array_append_val (builder->render_ops, op);
+}
+
void
ops_draw (RenderOpBuilder *builder,
const GskQuadVertex vertex_data[GL_N_VERTICES])